import base64
import json
import os
import uuid

from PySide6.QtWidgets import QWidget, QFileDialog
from Forms.MaskPage import Ui_Form
from Utils.AiCloud import MaskImage

class MaskPage(QWidget):
    def __init__(self, parent=None):
        super().__init__()
        if parent is not None:
            self.setParent(parent)
        # 加载FacePage的ui文件
        self.ui = Ui_Form()
        # 装载ui到本对象
        self.ui.setupUi(self)
        # 添加imageBase64属性用于存储图片的base64编码
        self.imageBase64 = ''
        # 初始化所有的信号槽连接
        self.initConnect()

    # 调用此方法将会初始化所有的信号槽的连接
    def initConnect(self):
        # 连接“选择图片按钮”的clicked信号与selectImage方法的信号槽
        self.ui.selectButton.clicked.connect(self.selectImage)
        # 连接“抠图按钮”的clicked信号与selectImage方法的信号槽
        self.ui.createButton.clicked.connect(self.createImage)

    def selectImage(self):
        # 创建一个打开文件对话框
        file = QFileDialog()
        file.exec()
        # 把选择的路径赋值给path变量
        path = file.selectedFiles()[0]
        # 设置图像框的图片路径
        self.ui.originImage.setImagePath(path)
        # 把选择的图片进行base64编码并存储在imageBase64属性中
        with open(path, 'rb') as image:
            self.imageBase64 = base64.b64encode(image.read()).decode('utf-8')

    def createImage(self):
        # 获取当前工作目录
        current_directory = os.getcwd()
        # 判断out文件夹是否存在
        if not os.path.exists(os.path.join(current_directory, 'out')):
            # 如果out文件夹不存在，则创建
            os.makedirs(os.path.join(current_directory, 'out'))
        # 判断imageBase64是否为空字符串如果是则终止生成
        if self.imageBase64 == '':
            return
        # 将图片的base64数据封装成字典，方便调用API传参
        params = {
            "Image": self.imageBase64
        }
        # 调用智能抠图服务并将params传递进去拿到响应结果转换成字典赋值给res
        res = json.loads(MaskImage(params))
        # 将响应数据中的ResultImage键对应的值进行base64解码，拿到图片的二进制数据
        image = base64.b64decode(res['ResultImage'])
        # 生成一个uuid作为图片的名字,保证图片名的唯一性防止输出图片时出现图片覆盖的情况
        fileName = str(uuid.uuid4()) + '.png'
        # 将图片的二进制数据写入到out目录下
        with open('./out/' + fileName, mode='wb') as file:
            file.write(image)
        # 设置图像框的图像路径，来显示生成的图像
        self.ui.maskImage.setImagePath('./out/' + fileName)
